package com.yx.cloud.utils;

import android.os.Environment;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.security.MessageDigest;

/**
 * 描述：File文件操作工具类
 * Created by huangyk on 2016/08/09.
 */
public class FileUtils {

    private static final String TAG = FileUtils.class.getSimpleName();
    private static String sRootDir;
    private static String sLogDir;
    private static String sVideoDir;
    private static String sAudioDir;
    private static String sPrintCachesDir;
    private static String sUpdateSaveDir;
    private static String sDreamTmpDir;
    // add by lijl for dreamscreen
    private static String sDreamDefaultDir;
    private static String sDreamLoadDir;
    // add end
    //add by lz
    private static String sOEMDir;
    //add end

    /**
     *
     */
    public static String getsOEMDir(){
        return sOEMDir;
    }

    /**
     * 获取文件缓存根目录
     */
    public static String getRootDir() {
        return sRootDir;
    }

    /**
     * 获取日志文件缓存目录
     */
    public static String getLogDir() {
        return sLogDir;
    }

    /**
     * 获取视频文件目录
     */
    public static String getVideoDir() {
        return sVideoDir;
    }

    /**
     * 获取音频文件目录
     */
    public static String getAudioDir() {
        return sAudioDir;
    }

    /**
     *
     * 获取打印缓存目录
     */
    public static String getPrintCachesDir() {
        return sPrintCachesDir;
    }

    /**
     * 获取升级包存储目录
     */
    public static String getsUpdateSaveDir() {
        return sUpdateSaveDir;
    }

    /**
     * 获取屏保路径
     */
    public static String getDreamTmpDir() {
        return sDreamTmpDir;
    }

    /**
     * add by lijl for dreamscreen
     * 获取屏保默认存放路径
     */
    public static String getsDreamDefaultDir() {
        return sDreamDefaultDir;
    }

    /**
     * add by lijl for dreamscreen
     * 获取屏保下载存放路径
     */
    public static String getsDreamLoadDir() {
        return sDreamLoadDir;
    }

    /**
     * 判断SDCard是否可用(是否挂载)
     */
    public static boolean isSDCardAvailable() {
        return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
    }

    /**
     * 获取SD卡路径
     */
    public static String getSDCardPath() {
        return Environment.getExternalStorageDirectory().getAbsolutePath();
    }


    /**
     * 创建文件夹
     */
    public static boolean createDirs(String dirPath) {
        File file = new File(dirPath);
        if (!file.exists() || !file.isDirectory())
            return file.mkdirs();
        return true;
    }

    /**
     * 递归删除某个目录下的所有文件
     *
     * @param dir         指定递归的根目录
     * @param isDeleteDir 是否删除根目录
     */
    public static void deleteFiles(File dir, boolean isDeleteDir) {
        if (!dir.exists()) return;
        if (dir.isDirectory()) {
            File[] files = dir.listFiles();
            if (files != null && files.length > 0) {
                for (File file : files)
                    deleteFiles(file, true);
            }
        }
        if (isDeleteDir) dir.delete();
    }

    /**
     * 获取单个文件的MD5值！
     *
     * @param file 文件名
     * @return
     */
    public static String getFileMD5(File file) {
        if (!file.isFile()) {
            return null;
        }
        MessageDigest digest = null;
        FileInputStream in = null;
        byte buffer[] = new byte[1024];
        int len;
        try {
            digest = MessageDigest.getInstance("MD5");
            in = new FileInputStream(file);
            while ((len = in.read(buffer, 0, 1024)) != -1) {
                digest.update(buffer, 0, len);
            }
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        BigInteger bigInt = new BigInteger(1, digest.digest());
        String downloadFileMD5 = bigInt.toString(16);
        StringBuffer md5sb = new StringBuffer();
        if (downloadFileMD5.length() < 32) {
            for (int i = 0; i < 32 - downloadFileMD5.length(); i++) {
                md5sb.append("0");
            }
        }
        md5sb.append(downloadFileMD5);
        return md5sb.toString();
    }


    /**
     * 获取文件的大小
     *
     * @param file 文件名
     * @return
     */
    public static double getDirSize(File file) {
        // 判断文件是否存在
        if (file.exists()) {
            // 如果是目录则递归计算其内容的总大小
            if (file.isDirectory()) {
                File[] children = file.listFiles();
                double size = 0;
                for (File f : children)
                    size += getDirSize(f);
                return size;
            } else {// 如果是文件则直接返回其大小,以“兆”为单位
                double size = (double) file.length() / 1024 / 1024;
                return size;
            }
        } else {
            System.out.println("文件或者文件夹不存在，请检查路径是否正确！");
            return 0.0;
        }
    }

    /**
     * 复制文件
     *
     * @param sourceFile 原文件名
     * @param targetFile 目标文件
     * @return
     */
    public static void copyFile(File sourceFile, File targetFile)
            throws IOException {
        // 新建文件输入流并对它进行缓冲
        FileInputStream input = new FileInputStream(sourceFile);
        BufferedInputStream inBuff = new BufferedInputStream(input);

        // 新建文件输出流并对它进行缓冲
        FileOutputStream output = new FileOutputStream(targetFile);
        BufferedOutputStream outBuff = new BufferedOutputStream(output);

        // 缓冲数组
        byte[] b = new byte[1024 * 5];
        int len;
        while ((len = inBuff.read(b)) != -1) {
            outBuff.write(b, 0, len);
        }
        // 刷新此缓冲的输出流
        outBuff.flush();
        output.getFD().sync();
        // 关闭流
        inBuff.close();
        input.close();
        outBuff.close();
        output.close();
    }

    /**
     * 复制目录
     *
     * @param prePath    为目标文件夹要去除的前缀
     * @param sourcePath 原文件夹路径
     * @param resPath    为目标文件夹(未减去prePath)
     * @return
     */
    public static void copyDirectory(String prePath, String sourcePath,
                                     String resPath) throws IOException {
        File dir = new File(sourcePath);
        File[] files = dir.listFiles();
        if (files == null)
            return;
        for (int i = 0; i < files.length; i++) {
            if (files[i].isDirectory()) {
                copyDirectory(prePath, files[i].getAbsolutePath(), resPath);
            } else {
                //prePath的前缀将被""替代
                String copyPath = resPath
                        + files[i].getAbsolutePath().replace(prePath, "");//prePath被“”替代
                File resFile = new File(copyPath);
                File parentFile = resFile.getParentFile();
                if (!parentFile.exists()) {
                    parentFile.mkdirs();
                    resFile.createNewFile();
                } else {
                    if (!resFile.exists()) {
                        resFile.createNewFile();
                    }
                }//目标文件路径=resPath-prePath
                copyFile(files[i], resFile);//copyFile(sourceFile,targetFile)
            }
        }
    }

    /**
     * 写， 读sdcard目录上的文件，要用FileOutputStream， 不能用openFileOutput
     * 不同点：openFileOutput是在raw里编译过的，FileOutputStream是任何文件都可以
     *
     * @param fileName
     * @param message
     */
    // 写在/mnt/sdcard/目录下面的文件
    public static void writeFileSdcard(String fileName, String message) {
        try {
            // FileOutputStream fout = openFileOutput(fileName, MODE_PRIVATE);
            FileOutputStream fout = new FileOutputStream(fileName, true);
            byte[] bytes = message.getBytes();
            fout.write(bytes);
            fout.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
